package com.linln.modules.system.repository;

import com.linln.modules.system.domain.Dept;
import com.linln.modules.system.domain.User;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;
import java.util.Map;

/**
 * @author 小懒虫
 * @date 2018/8/14
 */
public interface UserRepository extends BaseRepository<User, Long>, JpaSpecificationExecutor<User> {

    /**
     * 根据用户名查询用户数据
     * @param username 用户名
     * @return 用户数据
     */
    public User findByUsername(String username);

    /**
     * 根据openId查询用户数据
     * @param openId openId
     * @return 用户数据
     */
    public User findByOpenId(String openId);

    /**
     * 根据用户名查询用户数据,且排查指定ID的用户
     * @param username 用户名
     * @param id 排除的用户ID
     * @return 用户数据
     */
    public User findByUsernameAndIdNot(String username, Long id);

    public User findByPhoneAndIdNot(String phone, Long id);
    /**
     * 查找多个相应部门的用户列表
     * @param dept 部门对象
     * @return 用户列表
     */
    public List<User> findByDept(Dept dept);

    /**
     * 删除多条数据
     * @param ids ID列表
     * @return 影响行数
     */
    public Integer deleteByIdIn(List<Long> ids);

    /**
     * 解绑wx授权登录（删除时操作）
     * @param ids
     * @return
     */
    @Modifying
    @Query(nativeQuery = true, value = "update sys_user set open_id = '' where id in (:ids)")
    public Integer delWxOppid(List<Long> ids);

    /**
     * 更具手机查询用户
     * @param phone
     * @return
     */
    @Query(nativeQuery = true, value = "select * from sys_user where phone = ?1 and status = 1 ")
    public User findByPhone(String phone);

    /**
     * 根据角色获取用户
     * @param roleId
     * @param page
     * @param limit
     * @return
     */
    @Query(nativeQuery = true, value = "select su.id,nickname,phone from sys_user su left join sys_user_role sur on su.id = sur.user_id WHERE sur.role_id = ?1" +
            " and if(?4 !='',su.nickname like ?4,1=1) and if(?5 !='',su.phone = ?5,1=1) "+
            " limit ?2,?3")
    public List<Map<String,Object>> findByRoleId(Long roleId,long page , long limit,String nickname,String phone);



    /**
     * 根据角色获取用户
     * @param roleId
     * @return
     */
    @Query(nativeQuery = true, value = "select COUNT(id) from sys_user su left join sys_user_role sur on su.id = sur.user_id WHERE sur.role_id = ?1")
    public int findByRoleIdConut(Long roleId);

    /**
     * 修改取车人用户
     * @param id
     * @param nickname
     * @param phone
     * @param remark
     * @return
     */
    @Modifying
    @Query(nativeQuery = true, value = "update sys_user set nickname = ?2,phone = ?3 , remark = ?4 where id = ?1")
    int updateTakecaruser(Long id, String nickname, String phone, String remark);
}
